package com.hsu.apibackend.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hsu.apibackend.common.ErrorCode;
import com.hsu.apibackend.exception.BusinessException;
import com.hsu.apibackend.mapper.InterfaceInfoMapper;
import com.hsu.apibackend.service.InterfaceInfoService;
import com.hsu.apicommon.model.entity.InterfaceInfo;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 * @Author Hsu琛君珩
 * @Date 2024-09-09
 * @Version v1.0.0
 * @Description 接口信息服务实现类，负责校验接口信息及更新接口调用次数等功能。
 */
@Service
public class InterfaceInfoServiceImpl extends ServiceImpl<InterfaceInfoMapper, InterfaceInfo> implements InterfaceInfoService {

    /**
     * 校验接口信息
     *
     * @param interfaceInfo 接口信息对象
     * @param add           是否为创建时的校验
     */
    @Override
    public void validInterfaceInfo(InterfaceInfo interfaceInfo, boolean add) {
        if (interfaceInfo == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }

        // 校验接口的必要字段
        String name = interfaceInfo.getName();
        String url = interfaceInfo.getUrl();
        String method = interfaceInfo.getMethod();
        Integer reduceScore = interfaceInfo.getReduceScore();

        // 如果是新增接口，校验必填项是否为空
        if (add && StringUtils.isAnyBlank(name, url, method)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }

        // 处理HTTP方法和URL的格式
        if (StringUtils.isNotBlank(method)) {
            interfaceInfo.setMethod(method.trim().toUpperCase());
        }
        if (StringUtils.isNotBlank(url)) {
            interfaceInfo.setUrl(url.trim());
        }

        // 校验扣除积分
        if (ObjectUtils.isNotEmpty(reduceScore) && reduceScore < 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "扣除积分不能为负数");
        }

        // 校验名称和描述的长度
        if (StringUtils.isNotBlank(name) && name.length() > 60) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "接口名称过长");
        }
        String description = interfaceInfo.getDescription();
        if (StringUtils.isNotBlank(description) && description.length() > 100) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "接口描述过长");
        }
    }

    /**
     * 更新接口的总调用次数
     *
     * @param interfaceId 接口ID
     * @return 是否更新成功
     */
    @Override
    public boolean updateTotalInvokes(long interfaceId) {
        LambdaUpdateWrapper<InterfaceInfo> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(InterfaceInfo::getId, interfaceId);
        updateWrapper.setSql("totalInvokes = totalInvokes + 1");
        return this.update(updateWrapper);
    }
}
